/*
与加速度有关的定义和公式如下:
• 匀加速运动 是指物体在运动过程中,加速度保持不变的运动,即每单位时间内
速度的变化量是恒定的。
• 当一辆车的初速度为 v 0 、加速度 a ̸ = 0,做匀加速运动,则 t 时刻后它的速度
v 1 = v 0 + a × t,它的位移(即行驶路程)s = v 0 × t + 0.5 × a × t 2 。
• 当一辆车的初速度为 v 0 、加速度 a ̸ = 0,做匀加速运动,则当它的位移(即行驶
√
路程)为 s 时,这辆车的瞬时速度为 v 0 2 + 2 × a × s。
• 当一辆车的初速度为 v 0 、加速度 a ̸ = 0,在它的位移(即行驶路程)为
这辆车的瞬时速度为 v 1 。
如果你使用浮点数进行计算,需要注意潜在的精度问题。
*/
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int w=1,s=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')w*=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+ch-'0';
        ch=getchar();
    }
    return w*s;
}
const int M=1e5+10;
struct Car{
int d,v,a;
}a[M];
int T;
int test[M];


int main(){
freopen("detect.in","r",stdin);
freopen("detect.out","w",stdout);
T=read();
for(int l=1;l<=T;l++){
    int s1=0;
    int n=read(),m=read(),L=read(),V=read();
    int maxtest_place=INT_MIN;

    for(int i=1;i<=n;i++){
        a[i].d=read();
        a[i].v=read();
        a[i].a=read();
    }
    for(int i=1;i<=m;i++){
        test[i]=read();
        maxtest_place=max(maxtest_place,test[i]);
    }/*
    if(l==9){
        cout<<n<<" "<<m<<" "<<L<<" "<<V<<endl;
        for(int i=1;i<=n;i++){
            cout<<a[i].d<<" ";
            cout<<a[i].v<<" ";
            cout<<a[i].a<<endl;
        }
        for(int i=1;i<=m;i++)cout<<test[i]<<" ";
    }*/
    for(int i=1;i<=n;i++){
        if(a[i].a==0){
            if(maxtest_place<a[i].d){
                continue;
            }
            if(a[i].v<=V)continue;
            else if(a[i].v>V){s1++;
                    //cout<<i<<endl;
            }
        }
        else if(a[i].a<0){
            if(a[i].v<V){
                continue;
            }
            int place=-1000;
            for(int j=1;j<=m;j++){
                if(test[j]>=a[i].d){
                    place=test[j];
                    break;
                }
            }
            if(place==-1000){
                continue;
            }
            int v0=a[i].v;
            double s=((v0*(V-v0)+(V-v0)*(V-v0))*1.0)/(2*a[i].a*1.0);
            if(a[i].d+ceil(s)>place){
                    //cout<<i<<endl;
                s1++;
            }
        }
        else{
            if(V<=a[i].v){
                    //cout<<i<<endl;
                s1++;
                continue;
            }
            int v0=a[i].v;
            double s=((v0*(V-v0)+(V-v0)*(V-v0))*1.0)/(2*a[i].a*1.0);
            if(maxtest_place<=a[i].d+floor(s)){
                continue;
            }
            //cout<<i<<endl;
            s1++;
        }

    }
    if(s1==0)cout<<s1<<" "<<m<<endl;
    else cout<<s1<<" "<<m-1<<endl;
}
return 0;
}
/*
s=v*t+0.5*a*t*t;
deltav=sqrt(v*v+2*a*s);



*/
